﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../../../../xoskit/xos_helper/include/declare.h"
#include "../../../../xoskit/xos_helper/include/define.h"
#include "core.h"

namespace xos_container
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static char exe_path_array[4096] = { 0 };

    static xos::i_misc * misc_ptr = 0;
    static xos::i_crt * crt_ptr = 0;

    static xos::i_xos * api_ptr = 0;
    static void * module_ptr = 0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    core::core()
    {}

    core::~core()
    {}

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    xos::i_time * core::tm()
    {
        xos::i_time * pTime = 0;
        get()->create(xos::i_xos::XOS_OBJ_TIME, ( void ** )&pTime);
        return pTime;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    xos::i_misc * core::misc()
    {
        return misc_ptr;
    }

    xos::i_crt * core::crt()
    {
        return crt_ptr;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    const char * core::exe_path()
    {
        return exe_path_array;
    }

    xos::i_xos * core::get()
    {
        return api_ptr;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int core::init()
    {
        int ret = 0;

        xos::i_xos * pXos = 0;
        void * pModule = 0;

        xos::f_create fun = 0;

        if( 0 == ret )
        {
            ret = xos_helper::xos_load_and_get( ( void ** )&fun,
                pModule,
                0,
                "xos_core",
                "create" );
        }

        if( 0 == ret )
        {
            ret = fun( &pXos );
        }

        if( 0 == ret )
        {
            module_ptr = pModule;
            api_ptr = pXos;
            pModule = 0;
            pXos = 0;
        }

        if( 0 == ret )
        {
            ret = get()->create( xos::i_xos::XOS_OBJ_MISC, ( void ** )&misc_ptr );
        }

        if( 0 == ret )
        {
            ret = get()->create( xos::i_xos::XOS_OBJ_CRT, ( void ** )&crt_ptr );
        }

        if( 0 == ret )
        {
            core::misc()->get_process_path( exe_path_array, sizeof( exe_path_array ), 0 );
        }

        xos_stl::release_interface( pXos );
        xos_helper::xos_free( pModule );

        return ret;
    }

    int core::term()
    {
        int ret = 0;

        xos_stl::release_interface( misc_ptr );
        xos_stl::release_interface( crt_ptr );
        xos_stl::release_interface( api_ptr );

        xos_helper::xos_free( module_ptr );

        module_ptr = 0;
        api_ptr = 0;

        return ret;
    }

} // xos_container

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
